Remover primeiro elemento de uma Lista simples encadeada [dúvida]

1. Remover primeiro elemento de uma Lista simples encadeada [dúvida]

Eric Carneiro
EricCarneiro

(usa Ubuntu)

Enviado em 16/03/2011 - 13:45h

Pessoal, já tentei de tudo, mas não consigo encontrar onde estou errando. Seguinte:
Estudando aqui com o Livro Introdução a Estrutura de B.D. tem uma explicação e exemplo de uma lista encadeada(criar, inserir, remover, listar...) contudo ao remover o primeiro elemento da lista, ele não passa o ponteiro como deveria, pois quando mando listar ele imprime o valor 0 para o primeiro elemento depois de removido.

CÓDIGO:
************************************************************
#include <stdio.h>
#include <stdlib.h>


struct lista{
int info;
struct lista* prox;
};
typedef struct lista Lista;

/* função de criação: retorna uma lista vazia */
Lista* lst_cria(void)
{
return NULL;
}

/*inserção no início: retorna a lista atualizada */
Lista* lst_insere(Lista* l, int i)
{
Lista* novo=(Lista*)malloc(sizeof(Lista));
novo->info=i;
novo->prox=l;
return novo;
}

/*função imprime: imprime valores dos elementos */
void lst_imprime(Lista* l)
{
Lista* p; //variável auxiliar para percorrer a lista
for(p=l;p!=NULL;p=p->prox)
printf("info=%d\n",p->info);
printf("\n");
}

/*função vazia: retorna 1 se vazia ou 0 se não vazia */
int lst_vazia(Lista* l)
{
return(l==NULL);
}

/*função busca: busca um elemento na lista */
Lista* lst_busca(Lista* l, int v)
{
Lista* p;
for(p=l;p!=NULL;p=p->prox){
if(p->info==v)
return p;
}
return NULL; //não encontra o elemento: retorna nulo
}

/*função retira: retira o elemento da lista*/
Lista* lst_retira(Lista* l, int v)
{
Lista* ant=NULL; //ponteiro para elemento da lista
Lista* p=l; //ponteiro para percorrer a lista

/*procura um elemento na lista guardando o anterior*/
while(p!=NULL && p->info!=v){
ant=p;
p=p->prox;
}

/*verifica se achou o elemento*/
if(p==NULL)
return l; //não encontrou o elemento, retorna lista original

/*retira o elemento*/
if(ant==NULL){
/*retira o elemento do início*/
l=p->prox;
free(p);
return l;
}
else{
/*retira o elemento do meio da lista*/
ant->prox=p->prox;
}
free(p);
return l;
}

/*função libera: libera lista*/
void lst_libera(Lista* l)
{
Lista* p=l;
while (p!=NULL){
Lista* t = p->prox; //guarda referência para próximo elemento
free(p);
p=t;
}
}

/*função insere ordenado: insere elemento em ordem*/
Lista* lst_insere_ordenado(Lista* l, int v)
{
Lista* novo;
Lista* ant=NULL; //ponteiro para elemento anterior
Lista* p=l; //ponteiro para percorrer lista

/*procura posição de inserção*/
while(p!=NULL && p->info<v){
ant=p;
p=p->prox;
}

/*cria novo elemento*/
novo=(Lista*)malloc(sizeof(Lista));
novo->info=v;

/*encadeia elemento*/
if(ant==NULL){ //insere o elemento no início
novo->prox=l;
l=novo;
}
else{ //insere o elemento no meio da lista
novo->prox=ant->prox;
ant->prox=novo;
}
return l;
}

int main(void)
{
Lista* l; //declara uma lista não inicializada
l=lst_cria(); //cria e inicializa lista como vazia
l=lst_insere(l,23); //insere na lista o elemento 23
l=lst_insere(l,45); //insere na lista o elemento 45
l=lst_insere(l,56); //insere na lista o elemento 10
l=lst_insere(l,78); //insere na lista o elemento 33
lst_imprime(l); //deve imprimir: 78 56 45 23
lst_retira(l,78);
lst_imprime(l); //deve imprimir: 56 45 23
lst_retira(l,23);
lst_imprime(l); //deve imprimir: 56 23
lst_libera(l);
return 0;
}
************************************************************



  


2. Re: Remover primeiro elemento de uma Lista simples encadeada [dúvida]

???
gokernel

(usa Linux Mint)

Enviado em 22/03/2011 - 19:33h


Olá primeiro eu nao li o seu codigo direito(estou com pressa).

Aqui vai um codigo meu que libera o primeiro elemento de uma lista encadeada simples.



//----------------------------------------------

typedef struct AS_obj AS_obj;

struct AS_obj
{
AS_obj *first;
AS_obj *next;
};


AS_obj *OBJETO; // global


void free_top ( void )
{
AS_obj *aux;
AS_obj *info;

if ( !OBJETO->first )
return;

aux = OBJETO->first->next; // Backup.

// HERE: free the "AS_obj"
while ( OBJETO->first->first )
{
info = OBJETO->first->first->next;
free ( OBJETO->first->first );
OBJETO->first->first = info;
}

// Free the first object
free ( OBJETO->first );

OBJETO->first = aux; // restore the backup.

}//END: free_top()

//----------------------------------------------


Qualquer coisa, posta algum comentario.

gokernel
gokernel@hotmail.com



3. Acredito que este código resolva seu problema

Rafael
rafaelsi

(usa Outra)

Enviado em 18/09/2011 - 10:05h

#include "stdafx.h"
#include "stdlib.h"

struct no
{
int info;
struct no* prox;
};

typedef struct no Lst;

Lst* InicLista()
{
return NULL;
}

/* inserção no início: retorna a lista atualizada */
Lst* InsereLista(Lst* l, int x)
{
Lst* novo;
novo = (Lst*)(malloc(sizeof(Lst)));
novo->info = x;
novo->prox = l;
return novo;
}

void Imprime(Lst* l)
{
Lst* laux; // variável auxiliar para percorrer a lista
for (laux = l; laux != NULL; laux = laux->prox)
{
printf("info = %d\n",laux->info);
}
}

Lst* removerLista(Lst* l, int v)
{
Lst* ant = NULL;
Lst* p = l;

if(p == NULL)
{
return l;
}

if(p->info==v)
{
ant = p->prox;
free(p);
return ant;
}

while(p!=NULL && p->info!=v)
{
ant = p;
p = p->prox;
}

ant->prox = p->prox;
free(p);

return l;
}


int _tmain(int argc, _TCHAR* argv[])
{
Lst* Lista; // declara uma lista
Lista = InicLista(); // inicializa a lista

Lista = InsereLista(Lista,1); // insere na lista o elemento 23
Lista = InsereLista(Lista,2); // insere na lista o elemento 45
Lista = InsereLista(Lista,3); // insere na lista o elemento 45
Lista = InsereLista(Lista,4); // insere na lista o elemento 45
Lista = InsereLista(Lista,5); // insere na lista o elemento 45
Lista = InsereLista(Lista,6); // insere na lista o elemento 45
Lista = InsereLista(Lista,7); // insere na lista o elemento 45
Lista = InsereLista(Lista,8); // insere na lista o elemento 45
Imprime(Lista); // imprime os elmentos da lista na tela
printf("\n\n");
Lista = removerLista(Lista,5); // insere na lista o elemento 45
Lista = removerLista(Lista,8); // insere na lista o elemento 45
Lista = removerLista(Lista,4); // insere na lista o elemento 45
Imprime(Lista);
return 0;






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts